package domain;

//模拟磁盘管理
/*
设计思想
（1）属性：static的NUM_BLOCKS的磁盘块容量、
boolean[] blocksIsUse是否被使用
（2）方法：
① 对磁盘块进行初始化，开始磁盘块都未被使用
② 磁盘块分配，找到blocks[i] = false的磁盘块分配给文件，按顺序分配
③ 在删除文件后，要归还存储空间
 */
public class BlockManager {
    //默认的磁盘块容量有1000
    private static final int NUM_BLOCKS = 10000;
    //创建一个boolean[]数组来判断某块磁盘块是否被使用
    private boolean[] blocksIsUse;

    //对磁盘块进行初始化，开始磁盘块都未被使用
    public BlockManager() {
        blocksIsUse = new boolean[NUM_BLOCKS];
        for (int i = 0; i < blocksIsUse.length; i++)
            blocksIsUse[i] = false;//开始磁盘并没有被使用过
    }

    //磁盘块分配，找到blocks[i] = false的磁盘块分配给文件，按顺序分配
    public int allocateBlocksId() {
        for (int i = 0; i < blocksIsUse.length; i++) {
            if (!blocksIsUse[i]) {
                blocksIsUse[i] = true;
                return i;
            }
        }
        return -1;
    }

    public boolean[] getBlocksIsUse() {
        return blocksIsUse;
    }

    //在删除文件后，要归还存储空间
    public void freeBlock(int blockId) {
        if (blockId >= 0 && blockId < NUM_BLOCKS) {
            blocksIsUse[blockId] = false;
        }
    }

    public void writeBlock(int blockId, String content) {
        System.out.println("写这个内容在内存块id " + blockId + ": " + content);
    }

    public String readBlock(int blockId) {
        return "读这个内容在内存块id " + blockId;
    }

//    public int fillBlock(int size, int blockId) {
//        boolean[] flag = getBlocksIsUse();
//        for (int i = blockId; i <= size; i++)
//            flag[i] = true;
//        return blockId + size;
//    }
}
